import { createRouter, createWebHashHistory, RouteLocationNormalizedLoaded } from 'vue-router';
import { ElMessage } from 'element-plus';
import useDemoStore from '@/store/common.ts';
import Home from "@/views/Home/index.vue";
import About from "@/views/About/index.vue";
import Login from "@/views/Login/index.vue";

// 定义路由配置
const routes = [
  {
    path: '/home',
    name: 'Home',
    component: Home,
    meta: { requiresAuth: true } // 需要认证的页面
  },
  {
    path: '/about',
    name: 'About',
    component: About,
    meta: { requiresAuth: true } // 需要认证的页面
  },
  {
    path: '/login',
    name: 'Login',
    component: Login,
    meta: { requiresAuth: false } // 登录页面不需要认证
  },
  {
    path: '/',
    redirect: '/home' // 根路径重定向到首页
  },
];

// 创建 Vue Router 实例
const router = createRouter({
  history: createWebHashHistory(), // 使用哈希模式的历史管理
  routes
});

// 检查用户是否已登录
function isAuthenticated(): boolean {
  return !!localStorage.getItem('token'); // 检查本地存储中是否存在 token
}

// 判断路由是否需要认证
function isRequiresAuth(to: RouteLocationNormalizedLoaded): boolean {
  return to.matched.some(record => record.meta?.requiresAuth !== false); // 检查路由元信息中的 requiresAuth 属性
}

// 尝试刷新 token
async function refreshToken(): Promise<boolean> {
  const demoStore = useDemoStore();
  try {
    await demoStore.resetToken(); // 调用 store 中的 resetToken 方法刷新 token
    // localStorage.setItem('token', ''); // 更新本地存储中的 token（假设为空字符串表示刷新成功）
    return true; // 刷新成功
  } catch (error) {
    console.error('Failed to refresh token:', error); // 捕获并记录刷新 token 的错误
    return false; // 刷新失败
  }
}

// 定义常量以提高可读性和维护性
const LOGIN_ROUTE_NAME = 'Login'; // 登录页面的路由名称
const HOME_ROUTE_NAME = 'Home';   // 首页的路由名称

// 防止重复刷新 token 的标志和队列
let isRefreshing = false;
let failedQueue: Array<() => void> = [];

// 全局前置守卫，用于在每次导航前进行认证检查
router.beforeEach(async (to, from, next) => {
  const requiresAuth = isRequiresAuth(to); // 检查目标路由是否需要认证

  if (!requiresAuth || to.name === LOGIN_ROUTE_NAME) {
    // 如果不需要认证或目标是登录页面
    if (to.name === LOGIN_ROUTE_NAME && isAuthenticated()) {
      // 如果已登录且尝试访问登录页，重定向到首页
      next({ name: HOME_ROUTE_NAME });
      return;
    }
    next(); // 直接通过
    return;
  }

  if (!isAuthenticated()) {
    // 如果需要认证但未登录，跳转到登录页
    next({ name: LOGIN_ROUTE_NAME });
    return;
  }

  try {
    next(); // 继续导航
  } catch (error) {
    if (!isRefreshing) {
      isRefreshing = true;

      // 尝试刷新 token
      if (await refreshToken()) {
        isRefreshing = false;
        failedQueue.forEach(callback => callback()); // 处理等待的导航请求
        failedQueue = [];
        next(); // 继续导航
      } else {
        ElMessage({
          message: '您的会话已过期，请重新登录',
          type: 'warning',
          duration: 5 * 1000
        }); // 显示会话过期提示
        isRefreshing = false;
        failedQueue = [];
        next({ name: LOGIN_ROUTE_NAME }); // 重定向到登录页
      }
    } else {
      // 如果正在刷新 token，将当前导航请求加入队列
      failedQueue.push(() => {
        next();
      });
    }
  }
});

export default router; // 导出路由实例